/*!
 * \file WTSTypes.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader基础类型定义文件
 * 
 * \details 本文件定义了WonderTrader框架中使用的所有基础类型和枚举：
 *          - 合约分类：股票、期货、期权等不同类型的金融工具分类
 *          - 交易属性：买卖方向、开平标志、价格类型、订单标志等
 *          - 订单状态：委托状态、成交状态、错误代码等状态定义
 *          - 数据类型：K线周期、字段类型、日志级别等数据分类
 *          - 事件类型：解析器事件、交易器事件等系统事件
 *          
 *          这些类型定义是整个交易框架的基础，确保类型安全和代码一致性。
 */
#pragma once
#include "WTSMarcos.h"
#include <stdint.h>

NS_WTP_BEGIN

/*!
 * \brief 合约分类枚举
 * 
 * \details 定义各种金融工具的合约类型，包括：
 *          - 传统品种：股票、期货、期权等
 *          - 组合产品：组合、期转现等复杂品种
 *          - 数字货币：现货、合约、杠杆等数字货币品种
 *          
 *          该分类基于CTP接口规范，同时扩展支持数字货币交易
 */
typedef enum tagContractCategory
{
	CC_Stock,			///< 股票
	CC_Future,			///< 期货
	CC_FutOption,		///< 期货期权（商品期权、股指期权等）
	CC_Combination,		///< 组合
	CC_Spot,			///< 现货
	CC_EFP,				///< 期转现
	CC_SpotOption,		///< 现货期权（股票期权、指数期权等）
	CC_ETFOption,		///< 基金期权（ETF期权、LOF期权等）

	CC_DC_Spot	= 20,	///< 数字货币现货
	CC_DC_Swap,			///< 数字货币永续合约
	CC_DC_Future,		///< 数字货币期货
	CC_DC_Margin,		///< 数字货币杠杆
	CC_DC_Option		///< 数字货币期权
} ContractCategory;

/*!
 * \brief 期权类型枚举
 * 
 * \details 定义期权的看涨看跌类型：
 *          - 看涨期权：持有者有权以约定价格买入标的资产
 *          - 看跌期权：持有者有权以约定价格卖出标的资产
 */
typedef enum tagOptionType
{
	OT_None = 0,		///< 非期权
	OT_Call = '1',		///< 看涨期权
	OT_Put	= '2'		///< 看跌期权
} OptionType;

/*!
 * \brief 平仓模式枚举
 * 
 * \details 定义不同的平仓处理方式：
 *          - 区分今仓和昨仓的平仓处理
 *          - 支持强制平仓和优先平仓策略
 *          - 适应不同交易所的平仓规则
 */
typedef enum tagCoverMode
{
	CM_OpenCover,		///< 开平仓（区分开仓和平仓）
	CM_CoverToday,		///< 平今优先（优先平今仓）
	CM_UNFINISHED,		///< 平未了结（平未了结持仓）
	CM_None				///< 净持仓模式（不区分开平仓）
} CoverMode;

/*!
 * \brief 交易模式枚举
 * 
 * \details 定义不同的交易限制模式：
 *          - 支持多空双向交易或仅支持单向交易
 *          - T+1交易模式限制（如股票市场）
 */
typedef enum tagTradingMode
{
	TM_Both,	///< 多空双向都支持
	TM_Long,	///< 只允许做多
	TM_LongT1	///< 做多T+1（买入后T+1才能卖出）
} TradingMode;

/*!
 * \brief 价格模式枚举
 * 
 * \details 定义交易品种支持的价格类型：
 *          - 限价和市价的支持情况
 *          - 用于约束下单时的价格类型选择
 */
typedef enum tagPriceMode
{
	PM_Both,		///< 市价和限价都支持
	PM_Limit,		///< 只支持限价
	PM_Market		///< 只支持市价
} PriceMode;

/*!
 * \brief K线字段类型枚举
 * 
 * \details 定义K线数据的各个字段类型：
 *          - OHLC价格字段：开盘、最高、最低、收盘价
 *          - 时间和成交量字段
 *          - 用于K线数据的字段访问和处理
 */
typedef enum tagKlineFieldType
{
	KFT_OPEN,		///< 开盘价
	KFT_HIGH,		///< 最高价
	KFT_LOW,		///< 最低价
	KFT_CLOSE,		///< 收盘价
	KFT_DATE,		///< 日期时间
	KFT_VOLUME,		///< 成交量
	KFT_SVOLUME		///< 成交金额
} WTSKlineFieldType;

/*!
 * \brief K线周期枚举
 * 
 * \details 定义K线数据的时间周期：
 *          - Tick级别：逐笔数据
 *          - 分钟级别：1分钟、5分钟等
 *          - 日线级别：日、周、月K线
 */
typedef enum tagKlinePeriod
{
	KP_Tick,		///< Tick数据（逐笔成交）
	KP_Minute1,		///< 1分钟K线
	KP_Minute5,		///< 5分钟K线
	KP_DAY,			///< 日K线
	KP_Week,		///< 周K线
	KP_Month		///< 月K线
} WTSKlinePeriod;

///< K线周期名称数组，与WTSKlinePeriod枚举对应
static const char* PERIOD_NAME[] = 
{
	"tick",
	"min1",
	"min5",
	"day",
	"week",
	"month"
};

/*!
 * \brief 日志级别枚举
 * 
 * \details 定义日志输出的级别控制：
 *          - 从调试信息到致命错误的完整级别体系
 *          - 支持级别过滤，控制日志输出详细程度
 */
typedef enum tagLogLevel
{
	LL_ALL	= 100,		///< 所有级别
	LL_DEBUG,			///< 调试信息
	LL_INFO,			///< 一般信息
	LL_WARN,			///< 警告信息
	LL_ERROR,			///< 错误信息
	LL_FATAL,			///< 致命错误
	LL_NONE				///< 不输出日志
} WTSLogLevel;

/*!
 * \brief 价格类型枚举
 * 
 * \details 定义委托下单时的价格类型：
 *          - 基础类型：市价单、限价单、最优价等
 *          - CTP专用：针对CTP接口的特殊价格类型
 *          - 数字货币：针对数字货币交易的特殊价格类型
 *          
 *          不同的价格类型适用于不同的交易策略和市场环境
 */
typedef enum tagPriceType
{
	WPT_ANYPRICE	= 0,			///< 市价单（任意价）
	WPT_LIMITPRICE,					///< 限价单
	WPT_BESTPRICE,					///< 最优价
	WPT_LASTPRICE,					///< 最新价

	//////////////////////////////////////////////////////////////////////////
	//以下对应CTP的价格类型
	WPT_CTP_LASTPLUSONETICKS = 20,	///< 最新价+1ticks
	WPT_CTP_LASTPLUSTWOTICKS,		///< 最新价+2ticks
	WPT_CTP_LASTPLUSTHREETICKS,		///< 最新价+3ticks
	WPT_CTP_ASK1,					///< 卖一价
	WPT_CTP_ASK1PLUSONETICKS,		///< 卖一价+1ticks
	WPT_CTP_ASK1PLUSTWOTICKS,		///< 卖一价+2ticks
	WPT_CTP_ASK1PLUSTHREETICKS,		///< 卖一价+3ticks
	WPT_CTP_BID1,					///< 买一价
	WPT_CTP_BID1PLUSONETICKS,		///< 买一价+1ticks
	WPT_CTP_BID1PLUSTWOTICKS,		///< 买一价+2ticks
	WPT_CTP_BID1PLUSTHREETICKS,		///< 买一价+3ticks
	WPT_CTP_FIVELEVELPRICE,			///< 五档价（对手方最优价）

	//////////////////////////////////////////////////////////////////////////
	//以下对应数字货币的价格类型
	WPT_DC_POSTONLY	= 100,			///< 只做maker单
	WPT_DC_FOK,						///< 全部成交或立即取消
	WPT_DC_IOC,						///< 立即成交并取消剩余
	WPT_DC_OPTLIMITIOC				///< 市价委托立即成交并取消剩余
} WTSPriceType;

/*!
 * \brief 时间条件枚举
 * 
 * \details 定义委托订单的时间有效条件：
 *          - IOC：立即成交或取消剩余部分
 *          - GFS：本交易节有效
 *          - GFD：当日有效
 */
typedef enum tagTimeCondition
{
	WTC_IOC		= '1',	///< 立即成交，否则撤销
	WTC_GFS,			///< 本节有效
	WTC_GFD,			///< 当日有效
} WTSTimeCondition;

/*!
 * \brief 订单标志枚举
 * 
 * \details 定义订单的特殊属性标志：
 *          - NOR：普通订单
 *          - FAK：Fill and Kill（部分成交后取消剩余）
 *          - FOK：Fill or Kill（全部成交或全部取消）
 */
typedef enum tagOrderFlag
{
	WOF_NOR = '0',		///< 普通订单
	WOF_FAK,			///< FAK（部分成交后取消剩余）
	WOF_FOK,			///< FOK（全部成交或全部取消）
} WTSOrderFlag;

/*!
 * \brief 开平仓类型枚举
 * 
 * \details 定义期货交易中的开平仓操作类型：
 *          - OPEN：开仓操作
 *          - CLOSE：平仓操作（包括平今和平昨）
 *          - FORCECLOSE：强制平仓
 *          - CLOSETODAY：平今仓（当日开仓当日平仓）
 *          - CLOSEYESTERDAY：平昨仓（平历史持仓）
 */
typedef enum tagOffsetType
{
	WOT_OPEN			= '0',	///< 开仓
	WOT_CLOSE,					///< 平仓（默认为平昨）
	WOT_FORCECLOSE,				///< 强制平仓
	WOT_CLOSETODAY,				///< 平今仓
	WOT_CLOSEYESTERDAY,			///< 平昨仓
} WTSOffsetType;

/*!
 * \brief 买卖方向枚举
 * 
 * \details 定义交易的买卖方向：
 *          - LONG：做多（买入）
 *          - SHORT：做空（卖出）
 *          - NET：净持仓模式（不区分多空方向）
 */
typedef enum tagDirectionType
{
	WDT_LONG			= '0',	///< 做多（买入）
	WDT_SHORT,					///< 做空（卖出）
	WDT_NET						///< 净持仓
} WTSDirectionType;

/*!
 * \brief 业务类型枚举
 * 
 * \details 定义不同的交易业务类型：
 *          - CASH：普通现货交易
 *          - ETF：ETF申赎业务
 *          - EXECUTE：期权行权
 *          - QUOTE：期权报价
 *          - FORQUOTE：期权询价
 *          - FREEZE：期权冻结
 *          - CREDIT：融资融券业务
 *          - UNKNOWN：未知业务类型
 */
typedef enum tagBusinessType
{
	BT_CASH		= '0',	///< 普通现货交易
	BT_ETF		= '1',	///< ETF申赎
	BT_EXECUTE	= '2',	///< 期权行权
	BT_QUOTE	= '3',	///< 期权报价
	BT_FORQUOTE = '4',	///< 期权询价
	BT_FREEZE	= '5',	///< 期权冻结
	BT_CREDIT	= '6',	///< 融资融券
	BT_UNKNOWN			///< 未知业务类型
} WTSBusinessType;

/*
 *	������������
 */
typedef enum tagActionFlag
{
	WAF_CANCEL			= '0',	//����
	WAF_MODIFY			= '3',	//�޸�
} WTSActionFlag;

/*
 *	����״̬
 */
typedef enum tagOrderState
{
	WOS_AllTraded				= '0',	//ȫ���ɽ�
	WOS_PartTraded_Queuing,				//���ֳɽ�,���ڶ�����
	WOS_PartTraded_NotQueuing,			//���ֳɽ�,δ�ڶ���
	WOS_NotTraded_Queuing,				//δ�ɽ�
	WOS_NotTraded_NotQueuing,			//δ�ɽ�,δ�ڶ���
	WOS_Canceled,						//�ѳ���
	WOS_Submitting				= 'a',	//�����ύ
	WOS_Nottouched,						//δ����
} WTSOrderState;

/*
 *	��������
 */
typedef enum tagOrderType
{
	WORT_Normal			= 0,		//��������
	WORT_Exception,					//�쳣����
	WORT_System,					//ϵͳ����
	WORT_Hedge						//�Գ嶩��
} WTSOrderType;

/*
 *	�ɽ�����
 */
typedef enum tagTradeType
{
	WTT_Common				= '0',	//��ͨ
	WTT_OptionExecution		= '1',	//��Ȩִ��
	WTT_OTC					= '2',	//OTC�ɽ�
	WTT_EFPDerived			= '3',	//��ת�������ɽ�
	WTT_CombinationDerived	= '4'	//��������ɽ�
} WTSTradeType;


/*
 *	�������
 */
typedef enum tagErrorCode
{
	WEC_NONE			=	0,		//û�д���
	WEC_ORDERINSERT,				//�µ�����
	WEC_ORDERCANCEL,				//��������
	WEC_EXECINSERT,					//��Ȩָ�����
	WEC_EXECCANCEL,					//��Ȩ��������
	WEC_UNKNOWN			=	9999	//δ֪����
} WTSErroCode;

/*
 *	�Ƚ��ֶ�
 */
typedef enum tagCompareField
{
	WCF_NEWPRICE			=	0,	//���¼�
	WCF_BIDPRICE,					//��һ��
	WCF_ASKPRICE,					//��һ��
	WCF_PRICEDIFF,					//�۲�,ֹӯֹ��ר��
	WCF_NONE				=	9	//���Ƚ�
} WTSCompareField;

/*
 *	�Ƚ�����
 */
typedef enum tagCompareType
{
	WCT_Equal			= 0,		//����
	WCT_Larger,						//����
	WCT_Smaller,					//С��
	WCT_LargerOrEqual,				//���ڵ���
	WCT_SmallerOrEqual				//С�ڵ���
}WTSCompareType;

/*
 *	����������¼�
 */
typedef enum tagParserEvent
{
	WPE_Connect			= 0,		//�����¼�
	WPE_Close,						//�ر��¼�
	WPE_Login,						//��¼
	WPE_Logout						//ע��
}WTSParserEvent;

/*
 *	����ģ���¼�
 */
typedef enum tagTraderEvent
{
	WTE_Connect			= 0,		//�����¼�
	WTE_Close,						//�ر��¼�
	WTE_Login,						//��¼
	WTE_Logout						//ע��
}WTSTraderEvent;

/*
 *	������������
 */
typedef uint32_t WTSBSDirectType;
#define BDT_Buy		'B'	//����	
#define BDT_Sell	'S'	//����
#define BDT_Unknown ' '	//δ֪
#define BDT_Borrow	'G'	//����
#define BDT_Lend	'F'	//���

/*
 *	�ɽ�����
 */
typedef uint32_t WTSTransType;
#define TT_Unknown	'U'	//δ֪����
#define TT_Match	'M'	//��ϳɽ�
#define TT_Cancel	'C'	//����

/*
 *	ί����ϸ����
 */
typedef uint32_t WTSOrdDetailType;
#define ODT_Unknown		0	//δ֪����
#define ODT_BestPrice	'U'	//��������
#define ODT_AnyPrice	'1'	//�м�
#define ODT_LimitPrice	'2'	//�޼�

NS_WTP_END